<?php
// 需要预定义 UNIQID (高并发时区分不同客户端的请求, 跟踪id)
class FileLog
{
    private $dir = ''; //disk_free_space()
    private $filepath = ''; //日志文件完整路径
    private $logPath = LOGPATH; //日志存放目录的统一前缀
    private $separtor = "\t";

    /**
     * @param array|string $dir 要写入的目录
     * @param string $file 文件名, 默认为当天的日期
     * @return $this
     * @throws Exception
     */
    public static function ini($dir='', $file='')
    {
        $obj = new FileLog();
        $obj->dir($dir, $file);
        return $obj;
    }

    public static function path($dir='', $file='')
    {
        $obj = new FileLog();
        $obj->dir($dir, $file);
        return $obj;
    }

    public function __construct()
    {
    }
    
    /**
     * 设置日志的默认前缀, 不设置则用默认值
     * @param $str
     * @return $this
     */
    public function setLogPath($str)
    {
        $this->logPath = $str;
        return $this;
    }
    
    /**
     * 设置日志信息的分隔符, 不设置则用默认值
     * @param $str
     * @return $this
     */
    public function setSepartor($str)
    {
        $this->separtor = $str;
        return $this;
    }

    /**
     * @param array $dir 要写入的目录
     * @param string $file 文件名, 默认为当天的日期
     * @return $this
     * @throws Exception
     */
    private function dir($dir, $file='')
    {
        //组装目录
        if (is_array($dir)) {
            $this->dir = $this->logPath.implode('/', $dir);
        } else {
            $this->dir = $this->logPath.$dir;
        }
        

        //创建目录
        if (file_exists($this->dir) === FALSE) {
            if (!mkdir($this->dir, 0766, true)) {
                throw new Exception('创建日志目录失败: '.$this->dir);
            }
        }

        //组装文件完整路径
        $file = empty($file) ? REQUEST_DAY : $file;
        $this->filepath = $this->dir.'/'.$file.'.log';

        return $this;
    }
    
    /**
     * 记录日志
     * @param string|array|object $msg 日志信息
     * @param string $prefix 说明性文字 (单独列出来是为了, 不影响对数据信息的json_encode())
     * @return $this
     */
    private function log($msg, $prefix='')
    {
        if (is_array($msg) || is_object($msg)) {
            //$msg = json_encode($msg, JSON_UNESCAPED_UNICODE); //汉子原样显示, 不显示成编码格式
            $msg = json_encode($msg);
        }

        $datetime = date('Y-m-d H:i:s');
        $arr = [UNIQID, $datetime, $prefix, $msg];
        $string = implode($this->separtor, $arr).PHP_EOL;

        file_put_contents($this->filepath, $string, FILE_APPEND ); //追加模式

        return $this;
    }

    public function debug($msg, $prefix='')
    {
        if (LOG_LEVEL >= 1) {
            $this->log($msg, $prefix);
        }
    }

    public function info($msg, $prefix='')
    {
        if (LOG_LEVEL >= 2) {
            $this->log($msg, $prefix);
        }
    }

    public function notice($msg, $prefix='')
    {
        if (LOG_LEVEL >= 3) {
            $this->log($msg, $prefix);
        }
    }

    public function warning($msg, $prefix='')
    {
        if (LOG_LEVEL >= 4) {
            $this->log($msg, $prefix);
        }
    }

    public function error($msg, $prefix='')
    {
        if (LOG_LEVEL >= 5) {
            $this->log($msg, $prefix);
        }
    }

}
